package anno;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 *
 * @Component 创建对象的，等同于<Bean>的功能
 * 属性：value就是对象的名称，也就是bean的id值
 * value的值是唯一的，创建的对象在容器中只有一个
 * 位置：在类的上面
 * Spring中和@Component的功能一致，创建对象的注解还有：
 * @Repository ：用在持久层上面的，放在dao的实现类上面，表示创建doa对象，dao对象是可以访问数据库的
 * @services : 用在业务层的上面的，创建service对象，service对象做业务处理，可以有事务功能的
 * @Controller ：用在控制器上面的，创建控制器对象，能够接受用户提交的参数，显示请求的处理结果
 * 以上三个注解的使用语法和@Component一样的，都市创建对象的，但是这三个注解还有额外的功能，是给项目的对象分层的
 * 四个注解是不一样的，后面三个是有额外功能的注解
 * 除三个外不确定时使用@Component，
 *
 *
 * @Autowired 默认使用的是byType自动注入：在属性的定义上面，无需set方法
 *           属性：
 *               required =true：默认为true，为false时表示可以为空不报错，建议为true，提前发现错误
 *           如果要使用byName方式，需要做的是：
 *           1、在属性上面加入@Autowired
 *           2、在属性的上面加入@Qualifier(value="bean的id") ：表示使用指定名称的bean完成赋值
 *@Resource jdk支持的注解，spring提供对这个注解的支持，可以使用它给引用类型赋值，使用的也是自动注入原理，至此byneme，bytype，默认是bynme
 *           位置：在属性定义的上面，无需set方法，推荐使用
 *                在set方法的上面
 *          byneme:先使用Byname，如果失败再使用bytype
 *          只使用bynme的方式：@Resource("myschool")
 */

//使用value属性，指定对象名称
//@Component(value="myStudent")
//    省略value @Component(name = "myStudent")
//    @Component不指定名称，由spring提供默认的名称：类名的首字母小写

@Component("myStudent")
public class Student {
    @Value("xoiao")
    private String name;
    @Value("24")
    private int age;

//    @Autowired(required = false)
//    @Qualifier(value = "school")

//    @Resource(name="myschool")  //报错
    @Resource(name="school")
    private School school;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
        System.out.println("Student的无参构造方法执行了");
    }

    public void setName(String name) {
        this.name = name;
    }
}
